package com.domain.utils.alipay;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.domain.common.AppLogger;
import com.domain.controller.LoginController;
import com.domain.utils.UUIDUtils;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class AlipayUtil {
    /**
     * 日志
     */
    private static Logger logger = AppLogger.getLogger(LoginController.class.getSimpleName(), Level.INFO.toString(), true);

    /**
     * 支付创建订单信息
     *
     * @param body         对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
     * @param subject      商品的标题/交易标题/订单标题/订单关键字等。
     * @param total_amount 总金额
     * @return
     */
    public static AlipayTradeAppPayResponse creatAlipayOrder(String body, String subject, String total_amount) throws AlipayApiException {
        //实例化客户端
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.ALI_APIURL, AlipayConfig.ALI_APPID, AlipayConfig.ALI_APP_PRIVATE_KEY, AlipayConfig.ALI_FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALI_ALIPAY_PUBLIC_KEY, AlipayConfig.ALI_SIGN_TYPE);
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数，这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        //对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
        model.setBody(body);
        //商品的标题/交易标题/订单标题/订单关键字等。
        model.setSubject(subject);
        //订单号
        model.setOutTradeNo(UUIDUtils.getRandomUUID());
        //总金额
        model.setTotalAmount(total_amount);
        model.setProductCode("QUICK_MSECURITY_PAY");
        request.setBizModel(model);
        request.setNotifyUrl(AlipayConfig.ALI_NOTIFYURL);
        //这里和普通的接口调用不同，使用的是sdkExecute
        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
        logger.info("支付返回的信息" + response);
        return response;
    }

}
